package com.zhouzi.zhaoyang.util

import android.content.Context
import android.content.SharedPreferences
import com.zhouzi.zhaoyang.base.App
import com.zhouzi.zhaoyang.config.SharedPreferencesFinal

/**
 * Created by ZhouZi on 2018/12/20.
 * time:11:53
 * ----------Dragon be here!----------/
 * 　　　┏┓　　 ┏┓
 * 　　┏┛┻━━━┛┻┓━━━
 * 　　┃　　　　　 ┃
 * 　　┃　　　━　  ┃
 * 　　┃　┳┛　┗┳
 * 　　┃　　　　　 ┃
 * 　　┃　　　┻　  ┃
 * 　　┃　　　　   ┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛━━━━━
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━━━━━━神兽出没━━━━━━━━━━━━━━
 */
class SPUtils private constructor() {
    private var sp: SharedPreferences? = null
    private var editor: SharedPreferences.Editor? = null

    init {
        sp = App.mContext.getSharedPreferences(SharedPreferencesFinal.HKFACE, Context.MODE_PRIVATE)
        editor = sp?.edit()
        editor?.apply()
    }

    companion object {
        private var spUtils: SPUtils? = null
            get() {
                if (field == null) {
                    synchronized(SPUtils::class.java) {
                        if (field == null) {
                            field = SPUtils()
                        }
                    }
                }
                return field
            }

        fun getInstance(): SPUtils = spUtils!!
    }

    fun getValue(key: String, defaultValue: Any): Any? {
        return when (defaultValue) {
            is String -> sp?.getString(key, defaultValue)
            is Int -> sp?.getInt(key, defaultValue)
            is Boolean -> sp?.getBoolean(key, defaultValue)
            is Float -> sp?.getFloat(key, defaultValue)
            is Long -> sp?.getLong(key, defaultValue)
            else -> defaultValue
        }
    }

    fun putValue(key: String, value: Any) {
        when (value) {
            is String -> editor?.putString(key, value)
            is Int -> editor?.putInt(key, value)
            is Boolean -> editor?.putBoolean(key, value)
            is Float -> editor?.putFloat(key, value)
            is Long -> editor?.putLong(key, value)
        }
        editor?.apply()
    }

    fun remove(key: String) {
        editor?.remove(key)?.apply()
    }

    /**
     * 判断SP中是否存在该key
     *
     * @param key 键
     * @return `true`: 存在<br></br>`false`: 不存在
     */
    operator fun contains(key: String): Boolean {
        return sp?.contains(key)!!
    }

    /**
     * 清除SP中所有数据
     */
    fun clear() {
        editor?.clear()?.apply()
    }

}
